package com.zhentao.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zhentao.dto.QueryConditionDto;
import com.zhentao.dto.SummaryQueryResultDto;
import com.zhentao.pojo.DataCollection;

import java.util.List;

/**
 * 数据查询服务接口
 * 根据业务流程需求设计，支持三种查询类型
 */
public interface DataQueryService {
    
    /**
     * 汇总查询
     * 根据业务流程：基于外部数据审计库，根据查询条件、分组维度、输出字段展示对应的汇总数据
     * 支持按照维度进行下钻，最多选择三个分组维度
     * 
     * @param queryCondition 查询条件
     * @return 汇总查询结果列表
     */
    List<SummaryQueryResultDto> summaryQuery(QueryConditionDto queryCondition);
    
    /**
     * 汇总查询下钻
     * 支持逐级下钻溯源展示到最细粒度的原始数据
     * 
     * @param queryCondition 查询条件
     * @param drillDownPath 下钻路径（如：关区->企业->商品）
     * @return 下钻后的汇总数据
     */
    List<SummaryQueryResultDto> summaryQueryDrillDown(QueryConditionDto queryCondition, List<String> drillDownPath);
    
    /**
     * 数据查询
     * 根据业务流程：基于外部数据审计库，根据选择的查询条件及输出字段展示对应的数据
     * 支持逐级下钻溯源展示到最细粒度的原始数据
     * 
     * @param queryCondition 查询条件
     * @return 分页查询结果
     */
    IPage<DataCollection> dataQuery(QueryConditionDto queryCondition);
    
    /**
     * 原始数据查询
     * 根据业务流程：基于外部原始数据表，根据选择的查询条件及输出字段展示对应的原始数据
     * 
     * @param queryCondition 查询条件
     * @return 分页查询结果
     */
    IPage<DataCollection> rawDataQuery(QueryConditionDto queryCondition);
    
    /**
     * 导出查询结果
     * 支持汇总数据、数据查询结果、原始数据的导出
     * 
     * @param queryCondition 查询条件
     * @param exportType 导出类型：SUMMARY-汇总数据, DATA-数据查询结果, RAW_DATA-原始数据
     * @return 导出文件路径或数据
     */
    Object exportQueryResult(QueryConditionDto queryCondition, String exportType);
    
    /**
     * 获取可用的分组维度
     * 根据业务流程：支持用户手动定义为Level 1, Level 2, Level 3
     * 
     * @param queryType 查询类型
     * @return 可用的分组维度列表
     */
    List<String> getAvailableGroupDimensions(String queryType);
    
    /**
     * 获取可用的输出字段
     * 根据业务流程：汇总查询显示处理表中的数值型字段 + 报关单数量 + 记录数量
     * 
     * @param queryType 查询类型
     * @return 可用的输出字段列表
     */
    List<String> getAvailableOutputFields(String queryType);
    
    /**
     * 验证查询条件
     * 根据业务流程：验证分组维度数量（最多3个）、列值参数设置等
     * 
     * @param queryCondition 查询条件
     * @return 验证结果
     */
    boolean validateQueryCondition(QueryConditionDto queryCondition);
} 